package test;

import entity.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class test {

    public static void main(String[] args) {
        try {
            // 三种方法获取class 实例
            // 1.使用 getName()
            Class aClass = Class.forName("entity.Person");
            System.out.println(aClass);




            // 获取所有公共的构造方法
            Constructor[] constructors = aClass.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor);
            }



            // 获取当个的公共构造
            Constructor constructor = aClass.getConstructor();
            System.out.println("单个公共构造"+constructor);


            // 获取所有的构造方法
            Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
            for (Constructor declaredConstructor : declaredConstructors) {
                System.out.println(declaredConstructor);
            }
            // 获取单个的构造方法 / 也可以指定要哪一个构造方法 直接填写对象的类型
            Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);
            System.out.println("单个构造"+declaredConstructor);


            // 获取成员变量
            // 获取所有公共成员变量
            Field[] fields = aClass.getFields();
            System.out.println("所有公共的成员变量");
            for (Field field : fields) {
                System.out.println(field);
            }


            Field field1 = aClass.getField("message");
            // 获取成员变量message的修饰符
            String name = field1.getName();
            System.out.println("成员变量message的修饰符"+name);

            // 获取所有的成员变量
            Field[] declaredFields = aClass.getDeclaredFields();
            System.out.println("获取所有的成员变量");
            for (Field declaredField : declaredFields) {
                System.out.println(declaredField);
            }



//            // 2.使用 .getClass  (创建对象.class)
//            Person person = new Person();
//            Class clazz2 = person.getClass();
//            System.out.println(clazz2);
//
//            // 3. 类名.class
//            Class<Person> personClass = Person.class;
//            System.out.println(personClass);

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } finally {
        }
    }
}
